//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CCompteur.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck est utilisé est utilisé pour être sûr que les composants créés n'ont
// aucune fonction virtuelle pure.
//

static inline void ValidCtrCheck(CCompteur *)
{
    new CCompteur(NULL);
}
//---------------------------------------------------------------------------
__fastcall CCompteur::CCompteur(TComponent* Owner)
    : TCustomPanel(Owner)
{
  m_nIncrement = 1;
  m_nMin = 0;
  m_nMax = MaxInt;

  nTailleX = 23;
  nTailleY = 26;
  AutoSize = true;
  BevelInner = bvNone;
  BevelOuter = bvNone;
  Height = nTailleY + 4;
  iNombres = new TImage( this );
  iImage = new TImage( this );
  iNombres->Picture->Bitmap->LoadFromResourceName(( int)HInstance, "CHIFFRES");
  iImage->AutoSize = true;
  iImage->Parent = this;
  iImage->Left = 0;
  iImage->Top = 0;
  iImage->Height = Height;
  AfficheNombre();
}
//---------------------------------------------------------------------------
__fastcall CCompteur::~CCompteur()
{
  if (m_bUpDown) {
    delete ButtonUp;
    delete ButtonDown;
  }
  delete iImage;
  delete iNombres;
}

//---------------------------------------------------------------------------
void __fastcall CCompteur::UpClick(TObject *Sender)
{
  if ((m_nValeur < m_nMax) && (m_nValeur + m_nIncrement <= m_nMax))
    m_nValeur = m_nValeur + m_nIncrement;

  if (m_nValeur + m_nIncrement > m_nMax )
    ButtonUp->Enabled = false;

  ButtonDown->Enabled = true;
  AfficheNombre();
  ClickUp();
  Change();
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::DownClick(TObject *Sender)
{
  if ((m_nValeur > m_nMin) && (m_nValeur - m_nIncrement >= m_nMin))
    m_nValeur = m_nValeur - m_nIncrement;

  if (m_nValeur - m_nIncrement < m_nMin )
    ButtonDown->Enabled = false;

  ButtonUp->Enabled = true;  
  AfficheNombre();
  ClickDown();
  Change();
}

//---------------------------------------------------------------------------
void __fastcall CCompteur::AfficheNombre()
{
    AnsiString asChaine = "0";
    try {
      asChaine = IntToStr(m_nValeur);
    } catch (...) {
    }
    int nPositionY = 1;
    iImage->Picture->Bitmap->Width = (asChaine.Length() * nTailleX) + 7;
    iImage->Picture->Bitmap->Height = Height;
    // Dessin du tour noir
    iImage->Canvas->Pen->Color = clBlack;
    iImage->Canvas->MoveTo(0,iImage->Picture->Bitmap->Height-1);
    iImage->Canvas->LineTo(0,0);
    iImage->Canvas->LineTo(iImage->Picture->Bitmap->Width-1,0);
    // Dessin du tour blanc
    iImage->Canvas->Pen->Color = clWhite;
    iImage->Canvas->MoveTo(iImage->Picture->Bitmap->Width-1,1);
    iImage->Canvas->LineTo(iImage->Picture->Bitmap->Width-1,iImage->Picture->Bitmap->Height-1);
    iImage->Canvas->LineTo(1,iImage->Picture->Bitmap->Height-1);
    // Dessin du fond gris foncé
    iImage->Canvas->Brush->Color = clGray;
    iImage->Canvas->FillRect( Rect( 1, 1, iImage->Picture->Bitmap->Width-1, iImage->Picture->Bitmap->Height-1 ) );
    // Dessin des chiffres
    for (int i=1; i<=asChaine.Length(); i++) {
      int nChiffre = asChaine[i] - '0';
      int nPositionX = nChiffre * (nTailleX + 1) + 1;
      TRect RectDst = Rect(((i-1)*nTailleX) + 4, 3, i*nTailleX + 4, nTailleY + 3 );
      TRect RectSrc = Rect(nPositionX, nPositionY, nPositionX+nTailleX, nPositionY+nTailleY);
      iImage->Canvas->CopyRect( RectDst,
                                iNombres->Canvas,
                                RectSrc );
    }
    // Redimmensionnement des objets
    if (m_bUpDown) {
      ButtonUp->Left = iImage->Left + iImage->Width;
      ButtonDown->Left = iImage->Left + iImage->Width;
      Width = iImage->Picture->Bitmap->Width + ButtonDown->Width;
    } else {
      Width = iImage->Picture->Bitmap->Width;
    }
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::AffecteUpDown( void )
{
    ButtonUp = new TSpeedButton( this );
    ButtonDown = new TSpeedButton( this );
    ButtonUp->Parent = this;
    ButtonDown->Parent = this;
    ButtonUp->Height = Height / 2;
    ButtonUp->Width = Height / 2;
    ButtonDown->Height = Height / 2;
    ButtonDown->Width = Height / 2;
    ButtonDown->Top = Height / 2;
    ButtonUp->Glyph->LoadFromResourceName((int)HInstance,"UP");
    ButtonDown->Glyph->LoadFromResourceName((int)HInstance,"DOWN");
    ButtonDown->OnClick = DownClick;
    ButtonUp->OnClick = UpClick;

  if (m_nValeur > m_nMax) {
    MessageDlg("La valeur ne peut être supérieur au maximum !", mtError, TMsgDlgButtons() << mbOK, 0);
    m_nValeur = m_nMax;
  }
  if (m_nValeur < m_nMin) {
    MessageDlg("La valeur ne peut être inférieur au minimum !", mtError, TMsgDlgButtons() << mbOK, 0);
    m_nValeur = m_nMin;
  }

  AfficheNombre();
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::SetValeur( int n )
{
  if (m_bUpDown) {
    if (n > m_nMax) {
      MessageDlg("La valeur ne peut être supérieur au maximum !", mtError, TMsgDlgButtons() << mbOK, 0);
      m_nValeur = m_nMax;
    } else if (n < m_nMin) {
      MessageDlg("La valeur ne peut être inférieur au minimum !", mtError, TMsgDlgButtons() << mbOK, 0);
      m_nValeur = m_nMin;
    } else m_nValeur = n;
  } else m_nValeur = n;
  AfficheNombre();
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::SetUpDown( bool b )
{
  if (!b && m_bUpDown) {
    delete ButtonDown;
    delete ButtonUp;
    
    m_bUpDown = b;
  } else {
    m_bUpDown = b;
    if (m_bUpDown)
      AffecteUpDown();
  }
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::SetIncrement( int n )
{
  m_nIncrement = n;
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::SetMin( int n )
{
  if (n > m_nMax) {
    MessageDlg("Le minimum ne peut être supérieur au maximum !", mtError, TMsgDlgButtons() << mbOK, 0);
    m_nMin = m_nMax;
  } else {
    m_nMin = n;
  }
  if (m_bUpDown) {
    if (m_nMin > m_nValeur) {
      m_nValeur = m_nMin;
      AfficheNombre();
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall CCompteur::SetMax( int n )
{
  if (n < m_nMin) {
    MessageDlg("Le maximum ne peut être inférieur au minimum !", mtError, TMsgDlgButtons() << mbOK, 0);
    m_nMax = m_nMin;
  } else {
    m_nMax = n;
  }
  if (m_bUpDown) {
    if (m_nMax < m_nValeur) {
      m_nValeur = m_nMax;
      AfficheNombre();
    }
  }
}
//---------------------------------------------------------------------------
namespace Ccompteur
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(CCompteur)};
         RegisterComponents("EIC Outils", classes, 0);
    }
}
//---------------------------------------------------------------------------
